<?php

namespace application\service;

use application\entity\db\Catelog;
use application\entity\enu\Boolean;
use application\entity\enu\CatelogType;
use application\entity\form\CatelogForm;
use application\entity\input\CatelogSearch;
use application\entity\Response;
use application\model\CatelogModel;
use application\model\IDataModel;
use application\service\BaseService;
use application\util\TextUtil;
use core\entity\Criteria;
use core\entity\Page;
use core\util\TextUtil as TextUtilCore;


class CatelogService extends BaseService {

    private $catelogModel;
    private $idataModel;

    public function __construct() {
        $this->catelogModel = new CatelogModel();
        $this->idataModel = new IDataModel();
    }

    /**
     * Chi tiết theo id
     * @param type $id
     * @return type
     */
    public function get($id) {
        return $this->catelogModel->ifindById($id);
    }

    /**
     * Chi tiết theo seo url
     * @param type $seoUrl
     * @return type
     */
    public function getBySeoUrl($seoUrl) {
        return $this->catelogModel->getBySeoUrl($seoUrl);
    }

    /**
     * Danh mục theo type
     * @param type $type
     * @return type
     */
    public function getByType($type = CatelogType::APP) {
        return $this->catelogModel->getByType($type);
    }

    /**
     * Thêm mới danh mục
     * @param CatelogForm $form
     * @return \application\service\Response
     */
    public function add(CatelogForm $form) {
        if ($form == null || !is_object($form)) {
            return new Response(false, "Thông tin truyền chưa chính xác");
        }
        $form->id = null;
        $error = array();
        if (TextUtil::getVariable($form, 'name', null) == null) {
            $error["name"] = "Tên danh mục không được để trống";
        }
        if (TextUtil::getVariable($form, 'type', null) == null) {
            $error["type"] = "Kiểu danh mục không được để trống";
        }
        if (TextUtil::getVariable($form, 'parentId', null) != null) {
            $parent = $this->catelogModel->ifindById($form->parentId);
            if ($parent->id == null) {
                $error["parentId"] = "Danh mục không tồn tại trên hệ thống";
            } else if ($parent->type != $form->type) {
                $error["type"] = "Kiểu danh mục cấp con khác danh mục cấp cha";
            }
        }

        if (TextUtil::getVariable($form, 'seoUrl', null) != null) {
            $form->seoUrl = TextUtilCore::mb_truncate(TextUtilCore::removeMarks($form->name), 100);
        } else {
            $form->seoUrl = TextUtilCore::mb_truncate(TextUtilCore::removeMarks($form->seoUrl), 100);
        }
        if ($form->seoUrl != null && $this->catelogModel->exitBySeoUrl($form->seoUrl)) {
            $error["seoUrl"] = "Url seo đã tồn tại trên hệ thống";
        }
        if (!empty($error) || count($error) > 0) {
            return new Response(false, "Thêm danh mục không thành công, dữ liệu không chính xác!", $error);
        }

        $catelog = new Catelog();
        $catelog->active = $form->active == Boolean::TRUE;
        $catelog->name = $form->name;
        $catelog->leaf = true;
        $catelog->parentId = $form->parentId;
        $catelog->position = ($form->position > 0) ? $form->position : 0;
        $catelog->seoUrl = $form->seoUrl;
        $catelog->type = $form->type;
        $catelog = $this->catelogModel->isave($catelog);
        if ($catelog->id == null) {
            return new Response(false, "Thêm danh mục không thành công, dữ liệu không chính xác!", $this->catelogModel->error());
        }
        return new Response(true, "Thêm mới danh mục thành công", $catelog);
    }

    /**
     * Cập nhật thông tin danh mục
     * @param CatelogForm $form
     * @return \application\service\Response
     */
    public function edit(CatelogForm $form) {
        if ($form == null || $form->id == null) {
            return new Response(false, "Dữ liệu chưa được nhập", []);
        }
        $catelog = $this->catelogModel->ifindById($form->id);
        if ($catelog->id == null) {
            return new Response(false, "Danh mục không tồn tại trên hệ thống", []);
        }
        $error = [];
        if (TextUtil::getVariable($form, 'name', null) == null) {
            $error["name"] = "Tên danh mục không được để trống";
        }
        if (TextUtil::getVariable($form, 'type', null) == null) {
            $error["type"] = "Kiểu danh mục không được để trống";
        }
        if ($form->parentId != '') {
            if (TextUtil::getVariable($form, 'parentId', null) == null) {
                $parent = $this->catelogModel->ifindById($form->parentId);
                if ($parent->id == null) {
                    $error["parentId"] = "Danh mục cha không tồn tại trên hệ thống";
                } else if ($parent->type != $form->type) {
                    $error["type"] = "Kiểu danh mục cấp con khác danh mục cấp cha";
                }
            }
        }
        if (TextUtil::getVariable($form, 'seoUrl', null) != null) {
            $form->seoUrl = TextUtilCore::mb_truncate(TextUtilCore::removeMarks($form->name), 100);
        } else {
            $form->seoUrl = TextUtilCore::mb_truncate(TextUtilCore::removeMarks($form->seoUrl), 100);
        }
        if ($form->seoUrl != $catelog->seoUrl) {
            if (($form->seoUrl != null && $this->catelogModel->exitBySeoUrl($form->seoUrl))) {
                $error["seoUrl"] = "Url seo đã tồn tại trên hệ thống";
            }
        }

        if (!empty($error)) {
            return new Response(false, "Cập nhật danh mục không thành công, dữ liệu không chính xác!", $error);
        }
        $catelog->active = $form->active == Boolean::TRUE;
        $catelog->name = $form->name;
        $catelog->leaf = ($this->catelogModel->countByParentId($catelog->id) > 0) ? false : true;
        $catelog->parentId = $form->parentId;
        $catelog->position = ($form->position > 0) ? $form->position : 0;
        $catelog->seoUrl = $form->seoUrl;
        $catelog->type = $form->type;
        $catelog = $this->catelogModel->isave($catelog);
        if ($catelog->id == null) {
            return new Response(false, "Cập nhật danh mục không thành công, dữ liệu không chính xác!", $this->catelogModel->error());
        }
        if ($catelog->parentId > 0) {
            $parent = $this->catelogModel->ifindById($catelog->parentId);
            $parent->leaf = false;
            $this->catelogModel->isave($parent);
        }
        return new Response(true, "Cập nhật danh mục thành công", $catelog);
    }

    /**
     * Xóa danh mục
     * @param type $id
     * @return \application\service\Response
     */
    public function remove($id) {
        $catelog = $this->catelogModel->ifindById($id);


        if ($catelog->id == null) {
            return new Response(false, "Danh mục cần xóa không tồn tại");
        }
        if ($this->catelogModel->countByParentId($id) > 0) {
            return new Response(false, "Danh mục không thể xóa, cần xóa danh mục con.");
        }

        switch ($catelog->type) {
            case CatelogType::IMAGE: default :
                if ($this->idataModel->exitsByCategiryId($catelog->id)) {
                    return new Response(false, "Danh mục ảnh tồn tại sản phẩm, không thể xóa");
                }
                break;
        }
        $this->catelogModel->iremove($id);

        $parent = $this->catelogModel->ifindById($catelog->parentId);
        if ($parent->id != null) {
            $parent->leaf = ($this->catelogModel->countByParentId($parent->id) > 0) ? false : true;
            $this->catelogModel->isave($parent);
        }
        return new Response(true, "Xóa danh mục thành công");
    }

    /**
     * Tìm kiếm & danh sách sản phẩm
     * @param CatelogSearch $search
     * @return type
     */
    public function search(CatelogSearch $search) {
        $cri = new Criteria();
        if (TextUtil::getVariable($search, 'id', null) != null) {
            $cri->andKey('id')->is($search->id);
        }
        if (TextUtil::getVariable($search, 'seoUrl', null) != null) {
            $cri->andKey('seoUrl')->is($search->seoUrl);
        }
        if (TextUtil::getVariable($search, 'leaf', 0) > 0) {
            $cri->andKey('leaf')->is($search->leaf == Boolean::TRUE);
        }
        if (TextUtil::getVariable($search, 'active', 0) > 0) {
            $cri->andKey('active')->is($search->active == Boolean::TRUE);
        }
        if (TextUtil::getVariable($search, 'parentId', null) != null) {
            $cri->andKey('parentId')->is($search->parentId);
        }
        if (TextUtil::getVariable($search, 'type', null) != null) {
            $cri->andKey('type')->is($search->type);
        }
        $page = new Page();
        $page->pageIndex($search->pageIndex, $search->pageSize);
        $dataPage = $this->catelogModel->iSearch($cri, $page);
        return $dataPage;
    }
    public function getAll(){
        $cri = new Criteria();
        $page = new Page();
        $page->pageIndex(1, 1000);
        return $this->catelogModel->iSearch($cri,$page);
    }

    /**
     * Cập nhật trạng thái danh mục
     * @param type $id
     * @return \application\service\Response
     */
    public function changeActive($id) {
        $catelog = $this->catelogModel->ifindById($id);
        if ($catelog->id == null) {
            return new Response(false, "Danh mục không tồn tại");
        }
        $catelog->active = !$catelog->active;
        $this->catelogModel->isave($catelog);
        $this->catelogModel->updateActiveByParentId($id, $catelog->active);
        return new Response(true, "Danh mục " . $catelog->name . " đã " . ($catelog->active ? " được kích hoạt" : " bị tạm khóa"), $catelog);
    }

}
